package com.shuiyihan.design.creative.Singleton;

/**
 * 单例模式3 (双重检查锁版本)
 *
 * 参考文章: https://www.cnblogs.com/xz816111/p/8470048.html
 *
 * 确保某一个类中只有一个实例,而且自行实例化并向整个系统提供这个实例
 *
 * 1.单例类只能有一个实例
 * 2.单例类必须自己创建自己的唯一实例
 * 3.单例类必须给所有其他对象提供这一实例
 *
 * @author shuiyihan
 */
public class Singleton3 {

    /**
     * 1.单例类只能有一个实例 (使用volatile,重排序被禁止，所有的写（write）操作都将发生在读（read）操作之前。)
     **/
    private static volatile Singleton3 singleton;

    /**
     * 2.单例类必须自己创建自己的唯一实例
     **/
    private Singleton3() {
    }

    /**
     * 3.单例类必须给所有其他对象提供这一实例
     **/
    public static Singleton3 getInstance() {

        if (singleton == null) {
            //控制多线程安全
            synchronized (Singleton3.class) {
                if (singleton == null) {
                    //对象为空,创建对应实例
                    singleton = new Singleton3();
                }
            }
        }
        return singleton;
    }
}
